// /***************************************************
// *@Author       : fairy
// *@Date         : 2021-09-17 10:57:09
// *@LastEditors  : fairy
// *@LastEditTime : 2021-10-15 10:56:21
// *@FilePath     : PCF8591.c
// ***************************************************/
// #include "PCF8591.h"
// //#include "delay.h"

// bit AckFlag;							// 应答标志位

// void delay5us()		//@11.0592MHz
// {
// 	unsigned char i;

// 	_nop_();
// 	_nop_();
// 	_nop_();
// 	i = 10;
// 	while (--i);
// }


// ///***************************************************
// //*@description  : 定时器0初始化函数
// //*@param         {*}
// //*@return        {*}
// //***************************************************/
// //void timer0Init(void)
// //{
// //	EA    = 1;							// 打开总中断
// //	ET0   = 1;							// 打开定时器0中断
// //	TR0   = 1;	 						// 启动定时器0
// //	TMOD |= 0X01; 						// 定时器工作模式1，16位定时模式
// //	TH0   = 0xED;
// //	TL0   = 0xFF; 						// 设置定时5ms
// //}

// /***************************************************
// *@description  : I2C通信起始信号
// *@param         {*}
// *@return        {*}
// ***************************************************/
// void I2cStart(void)
// {
// 	SCL = 1;				
// 	SDA = 1;
// 	delay5us();
// 	SDA = 0;
// 	delay5us();
// }

// /***************************************************
// *@description  : I2C通信终止信号
// *@param         {*}
// *@return        {*}
// ***************************************************/
// void I2cStop(void)
// {
// 	SCL = 0;
// 	SDA = 0;
// 	SCL = 1;
// 	delay5us();
// 	SDA = 1;
// 	delay5us();
// }

// /***************************************************
// *@description  : 主机向从机发送（非）应答信号
// *@param         {bit} i 【0表示应答】【1表示非应答】
// *@return        {*}
// ***************************************************/
// void SendACK(bit i)
// {
// 	SCL = 0;	
// 	if(i)
// 	{
// 		SDA = 1;
// 	}
// 	else 
// 	{
// 		SDA = 0;	
// 	}
// 	SCL = 1;
// 	delay5us();
// 	SCL = 0;
// 	SDA = 1;							// 释放总线
// }

// /***************************************************
// *@description  : 主机读取从机发出的应答信号
// *@param         {*}
// *@return        {bit} 【0表示应答】【1表示非应答】
// ***************************************************/
// bit ReadACK(void)
// {
// 	SCL = 0;
// 	SCL = 1;
// 	delay5us();
// 	if(SDA)
// 	{
// 		SCL = 0;
// 		return 1;
// 	}
// 	else
// 	{
// 		SCL = 0;
// 		return 0;
// 	}
// }

// /***************************************************
// *@description  : I2C通信发送一字节数据（高位先发）
// *@param         {uchar} DAT 需要发送的数据
// *@return        {*}
// ***************************************************/
// void I2cSendByte(unsigned char DAT)
// {
// 	unsigned char i;
// 	for(i=0;i<8;i++)
// 	{
// 		SCL = 0;
// 		if(DAT & 0x80)
// 		{
// 			SDA = 1;
// 		}
// 		else
// 		{
// 			SDA = 0;
// 		}
// 		SCL = 1;
// 		DAT <<= 1;						// 数据左移
// 	}
// 	SCL = 0;
// 	SDA = 1;							// 释放总线
// }

// /***************************************************
// *@description  : 让PCF8591工作在DA模式下
// *@param         {uchar} CTRL 控制字节，配置PCF8591的工作方式
// *@param         {uchar} DAT  待转换的数值
// *@return        {*}
// ***************************************************/
// void PCF8591DA(unsigned char CTRL, unsigned char DAT)
// {
// 	I2cStart();							// 	起始信号
// 	I2cSendByte(PCF8591ADDR+I2cWrite);	//	发送一字节数据：AT24C02硬件地址和写操作

// 	if(ReadACK())						//	应
// 		AckFlag = 1;					//	答
// 	else								//	判
// 		AckFlag = 0;					//	断

// 	I2cSendByte(CTRL);					//	发送一字节数据：工作模式

// 	if(ReadACK())						//	应
// 		AckFlag = 1;					//	答
// 	else								//	判
// 		AckFlag = 0;					//	断

// 	I2cSendByte(DAT);					//	发送一字节数据：待转换的电压

// 	if(ReadACK())						//	应
// 		AckFlag = 1;					//	答
// 	else								//	判
// 		AckFlag = 0;					//	断

// 	I2cStop();							// 	终止信号
// }

// /***************************************************
// *@description  : I2C通信读取一字节数据，并返回读取的数据
// *@param         {*}
// *@return        {unsigned char} I2C读取出来的数据
// ***************************************************/
// unsigned char I2cReadByte(void)
// {
// 	unsigned char i,DAT;
// 	for(i=0;i<8;i++)
// 	{
// 		DAT <<= 1;
// 		SCL = 0;
// 		SCL = 1;
// 		if(SDA)
// 			DAT |= 0x01;
// 	}
// 	return DAT;
// }

// /***************************************************
// *@description  : 读取芯片PCF8591指定通道（CTRL）的电压
//                  并返回转换后的数据
// *@param         {unsigned char} CTRL 欲读取PCF8591的通道【CH*】
// *@return        {unsigned char} 读取出来的数据
// ***************************************************/
// unsigned char PCF8591Read(unsigned char CTRL)
// {
// 	unsigned char DAT;
// 	I2cStart();							// 	起始信号
// 	I2cSendByte(PCF8591ADDR+I2cWrite);	//	发送一字节数据：PCF8591硬件地址和写操作

// 	if(ReadACK())						//	应
// 		AckFlag = 1;					//	答
// 	else								//	判
// 		AckFlag = 0;					//	断

// 	I2cSendByte(CTRL);					//	发送一字节数据：待读取的通道

// 	ReadACK();							//	读取从机应答
// 	I2cStart();							// 	起始信号
// 	I2cSendByte(PCF8591ADDR+I2cRead);	//	发送一字节数据：PCF8591硬件地址和读操作
// 	if(ReadACK())						//	应
// 		AckFlag = 1;					//	答
// 	else								//	判
// 		AckFlag = 0;					//	断
// 	DAT = I2cReadByte();				//	读取一字节的数据
// 	SendACK(1);							//	主机向从机发送非应答，解除SDA占用
// 	I2cStop();							// 	终止信号
// 	return DAT;
// }